iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
0
自我挑戰組

SDN/NFV 網路虛擬化調度平台系列 第 10

Day 10 - Container Network Interface 介紹 II

  • 分享至 

  • xImage
  •  

前言

前一篇我們介紹了 CNI 的分類,這邊將個別介紹這些 CNI。

Bridge

在主機與容器之間創建一個 linux bridge 連接。
是一種 Linux 下的網路模式,能夠將多個 NIC Adapter ports 透過一個虛擬出來 Bridge(Switch) 全部串在一起並透過虛擬的網路裝置轉發出去。

CNI 的配置檔

{
    "cniVersion": "0.3.0",
    "name": "mynet",
    "type": "bridge",
    "bridge": "mynet0",
    "isDefaultGateway": true,
    "forceAddress": false,
    "ipMasq": true,
    "hairpinMode": true,
    "ipam": {
        "type": "host-local",
        "subnet": "10.10.0.0/16"
    }
}

IPvlan

在容器內創建 ipvlan 介面。
分為 L2 模式 L3模式,一個主介面只能選擇一種模式,無法混用。

  • L2 模式和 macvlan bridge 模式工作原理很相似,主介面作為 switch 來轉發 從介面的資料。同一個網路的從介面可以通過主介面來轉發資料,而如果想發送到其他網路,封包則會通過主介面的路由轉發出去。
  • L3 模式 ipvlan 有點像路由器的功能,它在各個虛擬網路和主機網路之間進行不同網路封包的路由轉發工作。只要主介面相同,即使虛擬機/容器不在同一個網路,也可以互相 ping 通對方,因为 ipvlan 會在中間做封包的轉發工作。
    當需要 mac 位址很多時建議使用 ipvlan。

CNI 的配置檔

{
    "name": "mynet",
    "type": "ipvlan",
    "master": "eth0",
    "ipam": {
        "type": "host-local",
        "subnet": "10.1.2.0/24"
    }
}

MACvlan

創建新的 MAC 位址,並轉發所有流量到容器內。
允許在主機的一個 NIC 上配置多個虛擬的 NIC,這些 NIC 有自己獨立的 MAC 地址,也可以配置上 IP address 進行通訊。
在 macvlan 下的 虛擬機 或者 容器 的網路和 主機 都在同一個網段中,共享同一個 broadcast domain。

CNI 的配置檔

{
    "name": "mynet",
    "type": "macvlan",
    "master": "eth0",
    "ipam": {
        "type": "dhcp"
    }
}

PTP

於主機和容器之間建立 veth pair。
可以把 veth pair 當做是雙向的 pipe(管道),從一个方向發送的網路封包,可以直接被另外一端接收到;或者也可以想象成兩個 namespace 直接通過一個特殊的虛擬網卡連接起来,可以直接通訊。

CNI 的配置檔

{
    "name": "mynet",
    "type": "ptp",
    "ipam": {
        "type": "host-local",
        "subnet": "10.1.1.0/24"
    },
    "dns": {
        "nameservers": [ "10.1.1.1", "8.8.8.8" ]
    }
}

CNI 簡單實作

這裡以 bridge & host-local CNI 為例,透過 linux network namespace 切割網路環境。

準備環境

下載 CNI tool

$ curl -O -L https://github.com/containernetworking/cni/releases/download/v0.5.2/cni-amd64-v0.5.2.tgz
tar -xzvf cni-amd64-v0.5.2.tgz

創建網路環境

$ ip netns add ns1
$ ip netns add ns2

建立配置檔

cat > bridge.conf <<"EOF"
{
    "name": "bridge",
    "type": "bridge",
    "bridge": "br0",
    "isGateway": true,
    "isDefaultGateway": true,
    "ipMasq": true,
    "ipam": {
      "type": "host-local",
      "subnet": "10.244.0.0/16",
      "routes": [
         { "dst": "0.0.0.0/0" }
      ],
      "gateway": "10.244.1.1"
    }
}
EOF

參照官網參數配置

配置 Network namespaces

$ CNI_COMMAND=ADD CNI_CONTAINERID=ns1 CNI_NETNS=/var/run/netns/ns1 CNI_IFNAME=eth3 CNI_PATH=`pwd` ./bridge <bridge.conf
{
    "ip4": {
        "ip": "10.244.0.1/16",
        "gateway": "10.244.1.1",
        "routes": [
            {
                "dst": "0.0.0.0/0",
                "gw": "10.244.1.1"
            },
            {
                "dst": "0.0.0.0/0",
                "gw": "10.244.1.1"
            }
        ]
    },
    "dns": {}
}
-----
$ CNI_COMMAND=ADD CNI_CONTAINERID=ns2 CNI_NETNS=/var/run/netns/ns2 CNI_IFNAME=eth3 CNI_PATH=`pwd` ./bridge <bridge.conf
{
    "ip4": {
        "ip": "10.244.0.2/16",
        "gateway": "10.244.1.1",
        "routes": [
            {
                "dst": "0.0.0.0/0",
                "gw": "10.244.1.1"
            },
            {
                "dst": "0.0.0.0/0",
                "gw": "10.244.1.1"
            }
        ]
    },
    "dns": {}
}

參照官網參數配置

確認網路連線

$ ip netns exec ns1 ping 10.244.0.2
PING 10.244.0.2 (10.244.0.2) 56(84) bytes of data.
64 bytes from 10.244.0.2: icmp_seq=1 ttl=64 time=0.148 ms
64 bytes from 10.244.0.2: icmp_seq=2 ttl=64 time=0.071 ms
-----
$ ip netns exec ns2 ping 10.244.0.1
PING 10.244.0.1 (10.244.0.1) 56(84) bytes of data.
64 bytes from 10.244.0.1: icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from 10.244.0.1: icmp_seq=2 ttl=64 time=0.060 ms

Reference

https://feisky.gitbooks.io/kubernetes/network/cni/
https://github.com/containernetworking/cni


上一篇
Day 9 - Container Network Interface 介紹 I
下一篇
Day 11 - Service Mesh 簡介
系列文
SDN/NFV 網路虛擬化調度平台30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言